package Control;

import Model.Cliente;
import Utilitaria.ConexaoBanco;
import Utilitaria.Util;
import View.limCliente;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class ctrCliente {
    public Vector vetCliente;
    private ConexaoBanco objConexao;
    private ctrPrincipal controlPrincipal;

    public ctrCliente (ctrPrincipal objCtrPrincipal, ConexaoBanco objConexao) throws SQLException {
        this.objConexao = objConexao;
        this.recuperaClientes();
        controlPrincipal = objCtrPrincipal;
        limCliente limCliente = new limCliente(this);
    }

    public int cadastraCliente( String Nome, String CPF, String Email, String Tel_celular, String Tel_residencial,
            String Tel_comercial, String End_rua, String End_bairro, String End_cep, String End_cidade) throws SQLException, Exception {

        int codCliente = this.ultimoCodigo() + 1;
        Cliente obj = new Cliente(codCliente, Nome, CPF, Email, Tel_celular, Tel_residencial, Tel_comercial, End_rua, End_bairro, End_cep, End_cidade);
        this.executaInsert(obj);
        int op = controlPrincipal.operacaoAnimal(codCliente, Util.CADASTRA);
        this.recuperaClientes();
        return op;

    }

    private void executaInsert(Cliente obj) throws Exception {

        String sqlCliente = "insert into tbl_cliente values (" +obj.getCodCliente()+
                ", '"+obj.getNome()+"', '"+obj.getCpf()+"', '"+obj.getEmail()+
                "', '"+obj.getTel_celular()+"', '"+obj.getTel_residencial()+"', '"+obj.getTel_comercial()+
                "', '"+obj.getEnd_rua()+"', '"+obj.getEnd_bairro()+"', '"+obj.getEnd_cep()+"', '"+obj.getEnd_cidade()+"')";
        objConexao.statement.executeUpdate(sqlCliente);

    }

    public int alterarCliente(String codCliente, String Nome, String CPF, String Email, String Tel_celular, String Tel_residencial, String Tel_comercial, String End_rua, String End_bairro, String End_cep, String End_cidade) throws Exception  {

        int index = 0;
        int aux = 0;
        int codBuscado = Integer.parseInt(codCliente);
        do {
            Cliente obj = (Cliente) vetCliente.elementAt(index);
            if(obj.getCodCliente() == codBuscado) {
                String sqlCliente ="UPDATE tbl_cliente SET "+
                                "cli_nome = '"+ Nome +"', "+
                                "cli_cpf = '"+ CPF +"', "+
                                "cli_email = '"+ Email +"', "+
                                "cli_tcelular = '"+ Tel_celular +"', "+
                                "cli_tresidencial = '"+ Tel_residencial +"', "+
                                "cli_tcomercial = '"+ Tel_comercial +"', "+
                                "cli_erua = '"+ End_rua +"', "+
                                "cli_ebairro = '"+ End_bairro +"', "+
                                "cli_ecep = '"+ End_cep +"', "+
                                "cli_ecidade = '"+ End_cidade +"' "+
                                "where cli_id = "+ codBuscado;
                if (objConexao.statement.executeUpdate(sqlCliente) == 1)
                    aux = 1;
                else
                    throw new Exception("");
            }
            index++;
        } while (aux == 0 && index <= vetCliente.size());
        this.recuperaClientes();
        return controlPrincipal.operacaoAnimal(codBuscado, Util.ALTERA);
    }

    public int excluir(String strCodCliente ) throws SQLException, Exception {

        Cliente objBuscado = null;
        int codCliente = Integer.parseInt(strCodCliente);
        int index = 0;
        do{
            objBuscado = (Cliente) vetCliente.elementAt(index);
            if(objBuscado.getCodCliente() == codCliente) {
                int opcao_escolhida = JOptionPane.showConfirmDialog(null,"Deseja excluir o cadastro de "
                        +objBuscado.getNome()+" ?", "Confirmação de exclusão", JOptionPane.YES_NO_OPTION);
                if (opcao_escolhida == JOptionPane.YES_OPTION){
                    int exclusao = objConexao.statement.executeUpdate("DELETE FROM tbl_cliente Where cli_id = " + codCliente);
                    this.recuperaClientes();
                }
                else
                    return -1;
            }
            index++;
        } while (index <= vetCliente.size());
        return controlPrincipal.operacaoAnimal(codCliente, Util.LIMPA);
    }

    public ArrayList<String> pesquisa_digitacao(int tamanho_pesquisa, String strBuscada) throws Exception {

        String igual = "n";
        Cliente objCliente = null;
        int index = 0;
        while(igual.equals("n") && index <= vetCliente.size()) {
            objCliente = (Cliente)vetCliente.elementAt(index);
            String pesquisado= objCliente.getNome().substring(0, tamanho_pesquisa);
            if (pesquisado.equals(strBuscada))
                igual = "s";
            else
                index++;
        }
        if(igual.equals("s")) {
            controlPrincipal.operacaoAnimal(objCliente.getCodCliente(), Util.PESQUISA);
            return montaResult(objCliente);
        }
        else
            throw new Exception ("");

    }

    private void recuperaClientes() throws SQLException {

        vetCliente = new Vector();
        objConexao.executeQuery("SELECT * FROM tbl_cliente");
        Cliente objCliente;
        while (objConexao.resultset.next()) {
            objCliente = new Cliente (
                        Integer.parseInt(objConexao.resultset.getString("cli_id")),//Codigo cliente
                        objConexao.resultset.getString("cli_nome"), //Nome
                        objConexao.resultset.getString("cli_cpf"), //CPF
                        objConexao.resultset.getString("cli_email"), //Email
                        objConexao.resultset.getString("cli_tcelular"),//Tel celular
                        objConexao.resultset.getString("cli_tresidencial"),//Tel residencial
                        objConexao.resultset.getString("cli_tcomercial"),//Tel comercial
                        objConexao.resultset.getString("cli_erua"), //Rua
                        objConexao.resultset.getString("cli_ebairro"), //Bairro
                        objConexao.resultset.getString("cli_ecep"), //CEP
                        objConexao.resultset.getString("cli_ecidade")); //Cidade
            vetCliente.addElement(objCliente);
        }

    }

    public ArrayList<String> primeiroCliente () throws Exception {

        Cliente firstElement = (Cliente) vetCliente.firstElement();
        if(firstElement != null){
            controlPrincipal.operacaoAnimal(firstElement.getCodCliente(), Util.PESQUISA);
            return montaResult(firstElement);
        }
        else
            throw new Exception ();

    }

    public ArrayList<String> ultimoCliente () throws Exception {

        Cliente lastElement = (Cliente) vetCliente.lastElement();
        if(lastElement != null){
            controlPrincipal.operacaoAnimal(lastElement.getCodCliente(), Util.PESQUISA);
            return montaResult(lastElement);
        }
        else
            throw new Exception ();

    }

    public ArrayList<String> proximoCliente (String strCodAnterior) throws Exception {

        Cliente objBuscado = null;
        int codAnterior = Integer.parseInt(strCodAnterior);
        int aux = 0, index = 0;
        do{
            Cliente objAnterior = (Cliente) vetCliente.elementAt(index);
            if(objAnterior.getCodCliente() == codAnterior) {
                objBuscado = (Cliente)vetCliente.elementAt(index + 1);// index + 1 implica o objeto posterior no vetor
                aux = 1;
            }
            index++;
        } while (aux == 0 && index <= vetCliente.size());
        if (aux == 1) {
            controlPrincipal.operacaoAnimal(objBuscado.getCodCliente(), Util.PESQUISA);
            return montaResult(objBuscado);
        }
        else
            throw new Exception ("");

    }

   public ArrayList<String> anteriorCliente (String strCodSucessor) throws Exception {

        Cliente objSucessor = null;
        Cliente objBuscado = null;
        int codSucessor = Integer.parseInt(strCodSucessor);
        int aux = 0, index = 0;
        do{
            objSucessor = (Cliente) vetCliente.elementAt(index);
            if(objSucessor.getCodCliente() == codSucessor && index == 0)
                index = -2; //recebe -2 para que no final do lop possa receber + 1 e sair do lop -> implica que o codigo passado para a função já é o codigo do primeiro registro
            if(objSucessor.getCodCliente() == codSucessor){
                objBuscado = (Cliente)vetCliente.elementAt(index - 1);// index - 1 implica o objeto anterior no vetor
                aux = 1;
            }
            index++;
        } while (aux == 0 && index != -1);
        if (aux == 1) {
            controlPrincipal.operacaoAnimal(objBuscado.getCodCliente(), Util.PESQUISA);
            return montaResult(objBuscado);
        }
        else
            throw new Exception ("");

    }

    private ArrayList<String> montaResult (Cliente obj){

        ArrayList<String> result = new ArrayList<String>();
        result.add(String.valueOf(obj.getCodCliente()));
        result.add(obj.getNome());
        result.add(obj.getCpf());
        result.add(obj.getEmail());
        result.add(obj.getTel_celular());
        result.add(obj.getTel_residencial());
        result.add(obj.getTel_comercial());
        result.add(obj.getEnd_rua());
        result.add(obj.getEnd_bairro());
        result.add(obj.getEnd_cep());
        result.add(obj.getEnd_cidade());
        return result;

    }

    private int ultimoCodigo( ) throws SQLException {

        int last = 0;
        objConexao.executeQuery("SELECT MAX(cli_id) FROM tbl_cliente");
        if (objConexao.resultset.last())
            last = objConexao.resultset.getInt("MAX(cli_id)");
        return last;

    }

    public JPanel chamaViewAnimal(){
        return controlPrincipal.chamaAnimal();
    }

    public void limpaAtributosAnimal() throws SQLException, Exception {
        int aux = 0; // so para fazer o operacaoAnimal funcionar direito
        controlPrincipal.operacaoAnimal(aux, Util.LIMPA);
    }
}